package cn.ztelovecly.springboot.framework.exception;

import java.util.ArrayList;
import java.util.List;

public class BaseException extends RuntimeException{


    /**
     * 错误列表
     */
    private List<Error> errors;

    public BaseException() {
        super();
    }

    /**
     * 创建异常时，会复制起因异常里的错误。
     * @param cause 起因异常
     */
    public BaseException(BaseException cause) {
        super(cause);
        this.setErrors(cause.getErrors());
    }

    /**
     * @param code 错误码
     * @param message 错误描述
     */
    public BaseException(String code, String message) {
        super(message);
        this.addError(code, message);
    }

    public BaseException(Error error) {
        super(error.getMessage());
        this.addError(error);
    }

    public BaseException(List<Error> errors) {
        this.setErrors(errors);
    }

    /**
     * 获取根源异常
     */
    public Throwable getRoot(){
        Throwable cause;
        for(cause = getCause();
            cause != null && cause.getCause() != null;
            cause = cause.getCause()
                ){}
        return cause;
    }

    /**
     * @param code 错误码
     * @param message 错误描述
     */
    public void addError(String code, String message){
         _getErrors().add(new Error(code,message));
    }

    public void addError(Error error){
         _getErrors().add( error);
    }

    /**
     * 清除所有错误信息
     */
    public void clearErrors(){
        if( errors != null ){
            errors.clear();
        }
    }

    /**
     * 获取全部的错误信息，返回的是副本
     */
    public List<Error> getErrors(){
        return new ArrayList<Error>( _getErrors());
    }

    /**
     * 是否有错误
     */
    public boolean hasError() {
        return ( errors != null ) && !errors.isEmpty();
    }

    /**
     * 设置全部的错误信息。
     * @param errors 全部的错误信息
     */
    public void setErrors(List<Error> errors){
        this.errors = errors;
    }

    private List<Error> _getErrors(){
        if(errors == null){
            errors = new ArrayList<Error>();
        }
        return errors;
    }

}
